﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Diagnostics;
using System.Text;
using System.Xml.Linq;
using System.Text.RegularExpressions;

namespace InfoPlayas
{
    public class PlayasParse
    {
        IDictionary<string, string> tablaAcentos = new Dictionary<string, string>();
       
        IDictionary<string, string> playaInformation = new Dictionary<string, string>();

        IDictionary<string, string> listaMunicipios = new Dictionary<string, string>();

        IDictionary<string, string> listaPlayas = new Dictionary<string, string>();

        IList<string> observaciones = new List<string>();
        bool notFound;

        public PlayasParse()
        {
            tablaAcentos.Add("&Ntilde;", "Ñ");
            tablaAcentos.Add("&ntilde;", "ñ");
            tablaAcentos.Add("&aacute;", "á");
            tablaAcentos.Add("&Aacute;", "Á");
            tablaAcentos.Add("&eacute;", "é");
            tablaAcentos.Add("&Eacute;", "É");
            tablaAcentos.Add("&iacute;", "í");
            tablaAcentos.Add("&Iacute;", "Í");
            tablaAcentos.Add("&oacute;", "ó");
            tablaAcentos.Add("&Oacute;", "Ó");
            tablaAcentos.Add("&uacute;", "ú");
            tablaAcentos.Add("&Uacute;", "Ú");
            tablaAcentos.Add("&ordm;", "º");
        }

        public String reemplazarAcentos(String html)
        {
                      

            foreach (KeyValuePair<string, string> ele in tablaAcentos)
            {
                html = html.Replace(ele.Key, ele.Value);
            }
            return (html);

        }

        public StringBuilder extractTablePlayas(string html)
        {
            StringBuilder sbReturn = new StringBuilder();
            //Extraemos la información propia de las tablas almacenado
            //en una tabla.

            String elements;
            if(html.IndexOf("fondoplayas")==-1)
            {
                notFound = true;
                return new StringBuilder("No encontrado");
            }

            elements = html.Substring(html.IndexOf("fondoplayas"));


            elements = elements.Substring(0, elements.IndexOf("</table>"));



            elements = reemplazarAcentos(elements);
            //para cada fila usan una clase css fondosplaya1 o fondos playa2
            String[] infoPlayas = Regex.Split(elements, "fondoplayas");
            //Recorremos y dividimos por los primeros :. Quitaremos los <td></td>

            for (int i = 0; i < infoPlayas.Length; i++)
            {



                //Ahora quitamos los elementos que nos sobran.
                if (infoPlayas[i].Contains(":"))
                {
                    int position = infoPlayas[i].IndexOf(':');
                    //No dividimos por: porque mailto tiene los :
                    String[] infoElement = new String[2];
                    infoElement[0] = infoPlayas[i].Substring(0, position);
                    infoElement[1] = infoPlayas[i].Substring(position + 1);
                    try
                    {
                        int tdStart = infoElement[0].IndexOf("<td>");
                        int tdEnd = infoElement[1].IndexOf("</td>");
                        String param1 = infoElement[0].Substring(tdStart + 4);
                        String param2 = infoElement[1].Substring(0, tdEnd);
                        param2 = param2.Replace("<strong>", "");
                        param2 = param2.Replace("</strong>", "");
                        playaInformation.Add(param1, param2);
                        sbReturn.Append(param1).Append("-").Append(param2).Append("\n");
                    }
                    catch (Exception ex)
                    {
                        Debug.Print(infoPlayas[i]);
                        //System.out.println(infoPlayas[i]);
                    }
                }
                else
                {
                    //Si contiene <td> entonces son las observacines
                      int tdStart = infoPlayas[i].IndexOf("<td>");
                       
                    if(tdStart>-1)
                    {
                        String auxObs = infoPlayas[i].Substring(tdStart + 4);
                        int tdEnd = auxObs.IndexOf("</td>");
                        if (tdEnd > -1)
                        {
                            auxObs = auxObs.Substring(0, tdEnd);

                            auxObs = auxObs.Replace("<br/>", "/");
                            auxObs = auxObs.Replace("<strong>", "");
                            auxObs = auxObs.Replace("</strong>", "");
                            observaciones.Add(auxObs);
                        }
                    }
                 
                }
            }
            return sbReturn;

        }     

        public String createXMLPlayas()
        {
            XElement root =new XElement("Playas");
            root.SetAttributeValue("Encontrado", !notFound);


            XDocument configuracion = new XDocument(
                new XDeclaration("1.0", "UTF-8", "yes"),
                root);
            if (notFound)
            {
                return (configuracion.ToString());
            }

            XElement servicios = new XElement("Servicios");

            XElement[] servicio = (from c in playaInformation
              select new XElement("Servicio", new XElement("Titulo",c.Key), new XElement("Valor",c.Value))).ToArray();

            servicios.Add(servicio);


            root.Add(servicios);

            if (observaciones.Count > 0)
            {
                XElement xmlobservaciones = new XElement("Observaciones");
                XElement[] xmlobs = (from c in observaciones
                                     select new XElement("Observacion", c)).ToArray();
                xmlobservaciones.Add(xmlobs);
                root.Add(xmlobservaciones);
            }

            return configuracion.ToString();
        }

        /// <summary>
        /// El html sirve tanto como la lsita de playas como para 
        /// la list ade municipios.
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public StringBuilder extractTableMunicipiosListaPlayas(String html, bool isPlaya)
        {
            //sacamos lo que hay entre las tabals
            String htmlelement=extractBetweenTags("table", html);
            htmlelement=reemplazarAcentos(htmlelement);
            //Sacamos la dirección que navega cada municipio o playa
            String[] auxMunicipios = Regex.Split(htmlelement, "href=\"");
            bool firstElement = true;
            foreach (string ele in auxMunicipios)
            {
                if (!firstElement)
                {
                    string ele1 = ele.Substring(0, ele.IndexOf("\""));
                    string ele2 = ele.Substring(ele.IndexOf("alt=\"") + 5);
                    ele2 = ele2.Substring(0, ele2.IndexOf("\""));
                   
                    if (isPlaya)
                    {
                        ele1 = ele1.Substring(ele1.IndexOf("?") + 1);
                        listaPlayas.Add(ele1, ele2);
                    }
                    else
                    {
                        listaMunicipios.Add(ele1, ele2);
                    }
                 
                }
                else
                {
                    firstElement = false;
                }
                 
            }

            return new StringBuilder(htmlelement);
        }

        public String createXMLMunicipios()
        {
            XElement root = new XElement("Municipios");
         


            XDocument configuracion = new XDocument(
                new XDeclaration("1.0", "UTF-8", "yes"),
                root);
          
          

            XElement[] municipio = (from c in listaMunicipios
                                   select new XElement("Municipio", new XElement("Pagina", c.Key), new XElement("Nombre", c.Value))).ToArray();

            root.Add(municipio);


           

            return configuracion.ToString();
        }

        public String createXMLListaPlayas()
        {
            XElement root = new XElement("Playas");



            XDocument configuracion = new XDocument(
                new XDeclaration("1.0", "UTF-8", "yes"),
                root);



            XElement[] municipio = (from c in listaPlayas
                                    select new XElement("Playa", new XElement("Pagina", c.Key), new XElement("Nombre", c.Value))).ToArray();

            root.Add(municipio);




            return configuracion.ToString();
        }

      

        private string extractBetweenTags(string tagToExtract, String html)
        {
            int elementStart = html.IndexOf("<" + tagToExtract + " ");
          
            String param1 = html.Substring(elementStart + tagToExtract.Length);
            int elementEnd = param1.IndexOf("</" + tagToExtract + ">");
            param1 = param1.Substring(0, elementEnd);
            return param1;
        }
    }
}
